\chapter{Expression des besoins}
\section{Fonctions principales}
Le système permet à un utilisateur d'envoyer une musique ou une vidéo sur un Raspberry-Pi branché à une télévision ou des enceintes, et ce à l'aide d'une application web ou d'une application pour \emph{smartphone}/tablette. Ces applications sont accessibles depuis le réseau local sur lequel se trouve le Raspberry-Pi. Une fois le média reçu sur ce dernier, il est ajouté à une liste de lecture, qui est lue au fur et à mesure, selon l'ordre de réception. De cette manière, toute personne présente dans la même pièce que le Raspberry-Pi peut profiter du contenu envoyé par le ou les utilisateurs de AirPi. La liste de lecture doit être modifiable et contrôlable.

\bigskip

Voici comment se déroule un envoi de fichier :
\begin{figure}[h!]
\centering
    \includegraphics[width=0.8\textwidth]{diagramme_sequence_android.png}
  \caption{Diagramme de séquence simplifié des échanges entre les différentes entités de AirPi lors de l'envoi d'un fichier, à partir de la connexion} 
\end{figure}

En résumé, les fonctionnalités principales sont :
\begin{itemize}
\item Permettre à un utilisateur d’envoyer de la musique ou des vidéos sur le Raspberry-Pi
\item Permettre de \og piloter\fg{} le logiciel de \emph{streaming} du Raspberry-Pi à distance
\end{itemize}

\section{Fonctions complémentaires}
Le système possède une interface graphique permettant aux utilisateurs d'intéragir directement sur le Raspberry-Pi, et d'afficher les titres des lectures en cours, ainsi que les utilisateurs connectés. Cette interface n'est néanmoins disponible que lorsque le Raspberry-Pi est relié à une télévision. Une interface similaire est disponible sur les pages web et applications \emph{smartphone}.

\bigskip

Une gestion basique des utilisateurs permet d'ajouter une couche de contrôle
supplémentaire. Afin d'éviter l'intervention de personnes malintentionnées, un
pseudonyme et un mot de passe sont démandés lors de la connexion au
Raspberry-Pi (sur les pages web ou les applications mobiles). Il existe deux
types de mots de passe :
l'un permet de se connecter en tant qu'administrateur, autorisant ainsi le
contrôle de la liste de lecture (ajouter ou supprimer un élément de la liste,
mettre pause l'élément actuellement lu, le stoppper, ou passer au suivant), et
le changement des mots de passe. L'autre mot de passe permet de se connecter en
tant qu'invité, et n'autorise que l'envoi de contenu. Celui-ci peut d'ailleurs
venir directement de l'utilisateur (fichier local sur ordinateur ou mobile), ou
de sites web tels que YouTube, Dailymotion, etc... Les deux types d'utilisateur
peuvent consulter la liste des médias et des utilisateurs connectés.

\bigskip

Une option sur les applications \emph{smartphone} permet de rechercher puis de se connecter automatiquement au Raspberry-Pi présent sur le réseau local.

\bigskip

Un utilisateur a la possibilité de se déconnecter à tout moment. Si tel est le cas, il est alors retiré de la liste des utilisateurs connectés.

\bigskip

En résumé, les fonctionnalités complémentaires sont :

\begin{itemize}
\item Gestion des utilisateurs
\item Permettre \og le pilotage\fg{} le Raspberry-Pi localement (avec la souris et le clavier relié au Raspberry-Pi)
\item Changer les mots de passe
\end{itemize}

\section{Contraintes et choix}
Ce projet se doit de répondre à certaines contraintes, nécessaires pour assurer la qualité du produit. Il est essentiel que ce système soit \og bon marché\fg{}. En effet, ce système a pour but d'être accessible au plus grand nombre, même à ceux dont les moyens sont limités. Cela nous a donc conduit à choisir un Raspberry-Pi, qui coûte approximativement 35 euros. Son installation est vraiment simple et à portée de tout le monde. Le seul inconvénient, et de taille, est que le Raspberry-Pi est limité en terme de puissance et ressources disponibles. Nous aurons cet \og obstacle \fg{} à prendre en compte lors du développement. Il faudra que notre application Java qui s'exécute sur le Raspberry-Pi consomme le moins de ressources possible. Nous aurons à optimiser les instanciations d'objets, à \og recycler\fg{} au maximum nos objets, etc.

\bigskip

Autre critère important : AirPi doit être utilisable sur n'importe quelle
plateforme, afin que quiconque, quelque soit son matériel, puisse l'utiliser.
C'est ainsi que nous avons choisi de mettre en place un serveur web.
Initialement, nous pensions créer un logiciel Java à installer sur les postes
des clients mais cela était trop contraignant et pas assez simple d'utilisation
pour l'usager lambda. Nous avons choisi de mettre en place un serveur Tomcat pour plusieurs raisons : nous souhaitions découvrir et mettre en pratique le langage Java EE que nous ne connaissions pas, et même si ce type de serveur recquiert une machine virtuelle Java pour s'exécuter, ce qui le rend plutôt lourd pour notre besoin, il reste relativement simple à installer et est facilement paramétrable.

\bigskip

De plus, le système doit être réactif : c'est-à-dire que le temps d'attente avant la lecture d'un média doit être réduit autant que possible. Nous avons cherché à nous rapprocher le plus possible d'un \og vrai \emph{streaming}\fg{}. Pour cela, nous avons choisi d'écrire sur le disque dur (ou carte SD) du Raspberry-Pi le fichier en cours d'envoi puis de le lire aussitôt, avant même que la totalité du fichier n'ait été reçue.
\newpage
\section{Diagramme des prestations (bête à cornes)}
\begin{figure}[h!]
\centering
    \includegraphics[width=0.6\textwidth]{bete_cornes.png}
  \caption{Bête à cornes décrivant le système AirPi} 
\end{figure}
